/**
 * @Copyright ®2015 Sinosoft Co. Ltd. All rights reserved.<br/>
 * 项目名称 : 电子商务云服务平台
 * 创建日期 : 2016年6月28日
 * 修改历史 : 
 *     1. [2016年7月14日]修改文件 by lijialun
 * 添加Javadoc注释，更新代码规范，静态工具类增加private构造函数
 */
package com.gavinwind.inspay.base;


import com.gavinwind.inspay.common.web.pagequery.PageGrid;
import com.gavinwind.inspay.common.web.pagequery.PageQueryModel;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.mybatis.spring.SqlSessionTemplate;

import javax.annotation.Resource;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**  
 * 【系统dao基类】
 * @Description: TODO
 * @author chenxin@sinosoft.com.cn
 * @date 2014-5-8 下午04:26:35 
 * @version V1.0  
 */
public class BaseMapper {
    /** sql模版类*/
    private SqlSessionTemplate sqlSessionTemplate;

    public SqlSessionTemplate getSqlSessionTemplate() {
        return sqlSessionTemplate;
    }

    @Resource(name = "sqlSession")
    public void setSqlSessionTemplate(SqlSessionTemplate cSqlSessionTemplate) {
        this.sqlSessionTemplate = cSqlSessionTemplate;
    }

    /**
     * logger of log4j
     */
    protected final Log logger = LogFactory.getLog(getClass());

    /**
     * 插入数据到数据库
     * @param cStatementName SQL名称
     * @param cObject  参数
     * @return
     * @return Object
     */
    protected Object saveObject(String cStatementName, Object cObject) {
        return this.getSqlSessionTemplate().insert(cStatementName, cObject);
    }

    /**
     * 更新数据到数据库
     * @param cStatementName  SQL名称
     * @param cObject   参数
     * @return
     * @return Object
     */
    protected int updateObject(String cStatementName, Object cObject) {
        return this.getSqlSessionTemplate().update(cStatementName, cObject);
    }

    /**
     * 删除数据库数据
     * @param cStatementName  SQL名称
     * @return Object
     */
    protected int deleteObject(String cStatementName) {
        return this.getSqlSessionTemplate().delete(cStatementName);
    }

    /**
     * 删除数据库数据
     * @param cStatementName  SQL名称
     * @param cParameterObject  参数        
     * @return Object
     */
    protected int deleteObject(String cStatementName, Object cParameterObject) {
        return this.getSqlSessionTemplate().delete(cStatementName, cParameterObject);
    }

    /**
     * 查询数据返回List数据集
     * @param cStatementName   SQL名称
     * @return Object
     */
    protected List<Object> queryForList(String cStatementName) {
        return this.getSqlSessionTemplate().selectList(cStatementName);
    }

    /**
     * 查询数据返回List数据集
     * @param cStatementName  SQL名称
     * @param cParameterObject  参数        
     * @return Object
     */

    protected List<Object> queryForList(String cStatementName, Object cParameterObject) {
        //setSqlCondition(statementName, parameterObject);
        return this.getSqlSessionTemplate().selectList(cStatementName, cParameterObject);
    }

    /**
     * 查询数据返回Object数据
     * @param cStatementName   SQL名称
     * @return Object
     */
    protected Object queryForObject(String cStatementName) {
        return this.getSqlSessionTemplate().selectOne(cStatementName);
    }

    /**
     * 查询数据返回Object数据
     * 
     * @param cStatementName 
     *          SQL名称
     * @param cParameterObject    
     *          参数        
     * @return
     * @return Object
     */
    protected Object queryForObject(String cStatementName, Object cParameterObject) {
        //setSqlCondition(statementName, parameterObject);
        return this.getSqlSessionTemplate().selectOne(cStatementName, cParameterObject);
    }

    /**
     * 分页查询方法
     * @param cStatementName  SQL名称
     * @param cParameterObject    参数        
     * @return Object
     */
    @SuppressWarnings({ "unchecked", "rawtypes" })
    protected PageGrid pageForObject(String cStatementName, PageQueryModel cParameterObject) {
        //setSqlCondition(statementName, parameterObject);

        int tTotal = 0;
        PageQueryModel tQueryModel = cParameterObject;
        if (tQueryModel == null) {
            tQueryModel = new PageQueryModel();
            // 设置查询全部
            tQueryModel.setQueryAll(true);
            // 不进行数量查询
            tQueryModel.setDoCount(false);
        }
        Map tQueryParam = new HashMap();
        if (tQueryModel.getQueryParam() != null) {
            tQueryParam = tQueryModel.getQueryParam();
        }
        tQueryParam.put("doCount", tQueryModel.getDoCount());
        tQueryParam.put("queryAll", tQueryModel.getQueryAll());
        tQueryParam.put("lastCursorPosition", tQueryModel.getLastCursorPosition());
        tQueryParam.put("firstCursorPosition", tQueryModel.getFirstCursorPosition());
        tQueryParam.put("pageSize", tQueryModel.getPageSize());
        if (tQueryModel.isDoCount()) {
            tTotal = (Integer) this.getSqlSessionTemplate().selectOne(cStatementName + "Sum", tQueryParam); //可以优化为常量
        }
        // 设置总条数
        //        pageGrid.setRecords(records);
        PageGrid tPageGrid = new PageGrid();
        tPageGrid.setTotal(tTotal);
        // 查询数据
        tQueryModel.setDoCount(false);
        tQueryParam.put("RESULT_COUNT", PageQueryModel.COUNT_ALL_NAME);
        tQueryParam.put("orderByColums", tQueryModel.getSortCol());
        List tData = this.queryForList(cStatementName, tQueryParam);
        tPageGrid.setRows(tData);
        tPageGrid.setPage(tQueryModel.getCurrentPage());
        if (cParameterObject.getPageSize() != 5) {
            tPageGrid.setSize(cParameterObject.getPageSize());
        } else {
            tPageGrid.setSize(PageQueryModel.PAGE_SIZE);
        }
        // 如果查询全部
        if (!tQueryModel.isQueryAll()) {
            // 设置总页数
            int tPageSize = tQueryModel.getPageSize();
            int tRecords = 0;
            if (tTotal != 0) {
                tRecords = (tTotal % tPageSize) == 0 ? (tTotal / tPageSize) : (tTotal / tPageSize + 1);
            }
            tPageGrid.setRecords(tRecords);
            // 设置当前页
            int tCurrentPage = tQueryModel.getCurrentPage();
            tPageGrid.setPage(tCurrentPage);
        }
        return tPageGrid;
    }

}
